include "llvm/Option/OptParser.td"

class F<string name>: Flag<["--", "-"], name>;
class S<string name>: Separate<["--", "-"], name>;
class R<list<string> prefixes, string name>
  : Option<prefixes, name, KIND_REMAINING_ARGS>;

// Please keep this in sync with the man page in docs/man/lldb.rst

// Attaching options.
def grp_attach : OptionGroup<"attaching">, HelpText<"ATTACHING">;

def attach_name: Separate<["--", "-"], "attach-name">,
  MetaVarName<"<name>">,
  HelpText<"Tells the debugger to attach to a process with the given name.">,
  Group<grp_attach>;
def: Separate<["-"], "n">,
  Alias<attach_name>,
  HelpText<"Alias for --attach-name">,
  Group<grp_attach>;

def wait_for: F<"wait-for">,
  HelpText<"Tells the debugger to wait for a process with the given pid or name to launch before attaching.">,
  Group<grp_attach>;
def: Flag<["-"], "w">,
  Alias<wait_for>,
  HelpText<"Alias for --wait-for">,
  Group<grp_attach>;

def attach_pid: Separate<["--", "-"], "attach-pid">,
  MetaVarName<"<pid>">,
  HelpText<"Tells the debugger to attach to a process with the given pid.">,
  Group<grp_attach>;
def: Separate<["-"], "p">,
  Alias<attach_pid>,
  HelpText<"Alias for --attach-pid">,
  Group<grp_attach>;


// Scripting options.
def grp_scripting : OptionGroup<"scripting">, HelpText<"SCRIPTING">;

def python_path: F<"python-path">,
  HelpText<"Prints out the path to the lldb.py file for this version of lldb.">,
  Group<grp_scripting>;
def: Flag<["-"], "P">,
  Alias<python_path>,
  HelpText<"Alias for --python-path">,
  Group<grp_scripting>;

def print_script_interpreter_info: F<"print-script-interpreter-info">,
  HelpText<"Prints out a json dictionary with information about the scripting language interpreter.">,
  Group<grp_scripting>;

def script_language: Separate<["--", "-"], "script-language">,
  MetaVarName<"<language>">,
  HelpText<"Tells the debugger to use the specified scripting language for user-defined scripts.">,
  Group<grp_scripting>;
def: Separate<["-"], "l">,
  Alias<script_language>,
  HelpText<"Alias for --script-language">,
  Group<grp_scripting>;

// Repl options.
def grp_repl : OptionGroup<"repl">, HelpText<"REPL">;

def repl: Flag<["--", "-"], "repl">,
  HelpText<"Runs lldb in REPL mode with a stub process.">,
  Group<grp_repl>;
def: Flag<["-"], "r">,
  Alias<repl>,
  HelpText<"Alias for --repl">,
  Group<grp_repl>;
def repl_: Joined<["--", "-"], "repl=">,
  MetaVarName<"<flags>">,
  HelpText<"Runs lldb in REPL mode with a stub process with the given flags.">,
  Group<grp_repl>;
def: Joined<["-"], "r=">,
  MetaVarName<"<flags>">,
  Alias<repl_>,
  HelpText<"Alias for --repl=<flags>">,
  Group<grp_repl>;

def repl_language: Separate<["--", "-"], "repl-language">,
  MetaVarName<"<language>">,
  HelpText<"Chooses the language for the REPL.">,
  Group<grp_repl>;
def: Separate<["-"], "R">,
  Alias<repl_language>,
  HelpText<"Alias for --repl-language">,
  Group<grp_repl>;


// Command options.
def grp_command : OptionGroup<"command">, HelpText<"COMMANDS">;

def no_lldbinit: F<"no-lldbinit">,
  HelpText<"Do not automatically parse any '.lldbinit' files.">,
  Group<grp_command>;
def: Flag<["-"], "x">,
  Alias<no_lldbinit>,
  HelpText<"Alias for --no-lldbinit">,
  Group<grp_command>;
def local_lldbinit: F<"local-lldbinit">,
  HelpText<"Allow the debugger to parse the .lldbinit files in the current working directory, unless --no-lldbinit is passed.">,
  Group<grp_command>;

def batch: F<"batch">,
  HelpText<"Tells the debugger to run the commands from -s, -S, -o & -O, and then quit.">,
  Group<grp_command>;
def: Flag<["-"], "b">,
  Alias<batch>,
  HelpText<"Alias for --batch">,
  Group<grp_command>;

def source_quietly: F<"source-quietly">,
  HelpText<"Tells the debugger not to echo commands while sourcing files or one-line commands provided on the command line.">,
  Group<grp_command>;
def: Flag<["-"], "Q">,
  Alias<source_quietly>,
  HelpText<"Alias for --source-quietly">,
  Group<grp_command>;

def one_line_on_crash: Separate<["--", "-"], "one-line-on-crash">,
  MetaVarName<"<command>">,
  HelpText<"When in batch mode, tells the debugger to run this one-line lldb command if the target crashes.">,
  Group<grp_command>;
def: Separate<["-"], "k">,
  Alias<one_line_on_crash>,
  HelpText<"Alias for --one-line-on-crash">,
  Group<grp_command>;

def source_on_crash: Separate<["--", "-"], "source-on-crash">,
  MetaVarName<"<file>">,
  HelpText<"When in batch mode, tells the debugger to source this file of lldb commands if the target crashes.">,
  Group<grp_command>;
def: Separate<["-"], "K">,
  Alias<source_on_crash>,
  HelpText<"Alias for --source-on-crash">,
  Group<grp_command>;

def source: Separate<["--", "-"], "source">,
  MetaVarName<"<file>">,
  HelpText<"Tells the debugger to read in and execute the lldb commands in the given file, after any file has been loaded.">,
  Group<grp_command>;
def: Separate<["-"], "s">,
  Alias<source>,
  HelpText<"Alias for --source">,
  Group<grp_command>;

def source_before_file: Separate<["--", "-"], "source-before-file">,
  MetaVarName<"<file>">,
  HelpText<"Tells the debugger to read in and execute the lldb commands in the given file, before any file has been loaded.">,
  Group<grp_command>;
def: Separate<["-"], "S">,
  Alias<source_before_file>,
  HelpText<"Alias for --source-before-file">,
  Group<grp_command>;

def one_line: Separate<["--", "-"], "one-line">,
  MetaVarName<"<command>">,
  HelpText<"Tells the debugger to execute this one-line lldb command after any file provided on the command line has been loaded.">,
  Group<grp_command>;
def: Separate<["-"], "o">,
  Alias<one_line>,
  HelpText<"Alias for --one-line">,
  Group<grp_command>;

def one_line_before_file: Separate<["--", "-"], "one-line-before-file">,
  MetaVarName<"<command>">,
  HelpText<"Tells the debugger to execute this one-line lldb command before any file provided on the command line has been loaded.">,
  Group<grp_command>;
def: Separate<["-"], "O">,
  Alias<one_line_before_file>,
  HelpText<"Alias for --one-line-before-file">,
  Group<grp_command>;


// General options.
def version: F<"version">,
  HelpText<"Prints out the current version number of the LLDB debugger.">;
def: Flag<["-"], "v">,
  Alias<version>,
  HelpText<"Alias for --version">;

def help: F<"help">,
  HelpText<"Prints out the usage information for the LLDB debugger.">;
def: Flag<["-"], "h">,
  Alias<help>,
  HelpText<"Alias for --help">;

def core: Separate<["--", "-"], "core">,
  MetaVarName<"<filename>">,
  HelpText<"Tells the debugger to use the full path to <filename> as the core file.">;
def: Separate<["-"], "c">,
  Alias<core>,
  HelpText<"Alias for --core">;

def editor: F<"editor">,
  HelpText<"Tells the debugger to open source files using the host's \"external editor\" mechanism.">;
def: Flag<["-"], "e">,
  Alias<editor>,
  HelpText<"Alias for --editor">;

def no_use_colors: F<"no-use-colors">,
  HelpText<"Do not use colors.">;
def: Flag<["-"], "X">,
  Alias<no_use_colors>,
  HelpText<"Alias for --no-use-color">;

def file: Separate<["--", "-"], "file">,
  MetaVarName<"<filename>">,
  HelpText<"Tells the debugger to use the file <filename> as the program to be debugged.">;
def: Separate<["-"], "f">,
  Alias<file>,
  HelpText<"Alias for --file">;

def arch: Separate<["--", "-"], "arch">,
  MetaVarName<"<architecture>">,
  HelpText<"Tells the debugger to use the specified architecture when starting and running the program.">;
def: Separate<["-"], "a">,
  Alias<arch>,
  HelpText<"Alias for --arch">;

def debug: F<"debug">,
  HelpText<"Tells the debugger to print out extra information for debugging itself.">;
def: Flag<["-"], "d">,
  Alias<debug>,
  HelpText<"Alias for --debug">;

def REM : R<["--"], "">;
